#include<bits/stdc++.h>
using namespace std;
typedef pair<int,int> pii;
inline vector<int> get_eb(int n,vector<pii> e){
  vector<vector<int> > g(n);
  for(auto q:e){
    int u,v; tie(u,v)=q;
    g[u].emplace_back(v);
    g[v].emplace_back(u);
  }
  int o=0,r=0;
  vector<int> d(n,-1),l(n),c(n,-1);
  stack<int> s;
  function<void(int,int)> tarjan=[&](int u,int f){
    d[u]=l[u]=o++,s.emplace(u);
    for(int i:g[u])
      if(d[i]<0){
        tarjan(i,u),l[u]=min(l[u],l[i]);
        if(l[i]>d[u]){
          while(s.top()!=i)c[s.top()]=r,s.pop();
          c[i]=r++,s.pop();
        }
      }
      else if(i!=f)l[u]=min(l[u],d[i]);
  };
  tarjan(0,0);
  while(s.top())c[s.top()]=r,s.pop();
  c[0]=r++,s.pop();
  return c;
}
class segtree{
  private:
    int n;
    vector<pii> B;
    vector<int> R,T;
    inline void pushdown(int u){
      if(T[u]){
        R[u<<1]+=T[u],R[u<<1|1]+=T[u];
        T[u<<1]+=T[u],T[u<<1|1]+=T[u],T[u]=0;
      }
    }
  public:
    segtree(){}
    segtree(int n):n(n){
      B.resize(n<<2),R.resize(n<<2),T.resize(n<<2);
      function<void(int,int,int)> build=[&](int u,int l,int r){
        B[u]=make_pair(l,r);
        if(l==r)return;
        int m=l+r>>1;
        build(u<<1,l,m),build(u<<1|1,m+1,r);
      };
      build(1,0,n-1);
    }
    inline void update(int u,int l,int r){
      if(l>r||B[u].first>r||B[u].second<l)return;
      if(l<=B[u].first&&B[u].second<=r){
        R[u]++,T[u]++; return;
      }
      pushdown(u);
      update(u<<1,l,r),update(u<<1|1,l,r);
    }
    inline vector<int> get2(){
      vector<int> v;
      function<void(int,int,int)> dfs=[&](int u,int l,int r){
        if(l==r){v.emplace_back(R[u]); return;}
        int m=l+r>>1; pushdown(u);
        dfs(u<<1,l,m),dfs(u<<1|1,m+1,r);
      };
      dfs(1,0,n-1);
      return v;
    }
};
class hld{
  private:
    int n;
    vector<int> f,e,d,h,l,t;
    segtree T;
  public:
    hld(vector<vector<int> > g){
      n=g.size(),f.resize(n),e.resize(n,1),d.resize(n);
      h.resize(n,-1),l.resize(n),t.resize(n);
      function<void(int,int)> dfs=[&](int u,int p){
        int mx=0;
        for(int i:g[u])
          if(i!=p){
            f[i]=u,d[i]=d[u]+1;
            dfs(i,u),e[u]+=e[i];
            if(e[i]>mx)mx=e[i],h[u]=i;
          }
      };
      int o=0;
      function<void(int,bool)> decomp=[&](int u,bool b){
        t[u]=(b?t[f[u]]:u),l[u]=o++;
        if(~h[u])decomp(h[u],true);
        for(int i:g[u])
          if(i!=f[u]&&i!=h[u])decomp(i,false);
      };
      dfs(0,0),decomp(0,false),T=segtree(n);
    }
    inline void update(int u,int v){
      while(t[u]!=t[v]){
        if(d[t[u]]>d[t[v]])swap(u,v);
        T.update(1,l[t[v]],l[v]),v=f[t[v]];
      }
      if(d[u]>d[v])swap(u,v);
      T.update(1,l[u]+1,l[v]);
    }
    inline int get(int r){
      auto c=T.get2();
      sort(c.begin(),c.end(),greater<>());
      return c[0]+(r>1&&c.size()>1?c[1]:0);
    }
};
int main(){
  freopen("hide.in","r",stdin);
  freopen("hide.out","w",stdout);
  ios::sync_with_stdio(false);
  cin.tie(0); cout.tie(0);
  int n,m,k,r; cin>>n>>m>>k>>r;
  vector<pii> e(m);
  for(auto &i:e)cin>>i.first>>i.second,i.first--,i.second--;
  auto c=get_eb(n,e);
  vector<vector<int> > g(*max_element(c.begin(),c.end())+1);
  for(auto i:e){
    int u,v; tie(u,v)=i;
    if(c[u]!=c[v]){
      g[c[u]].emplace_back(c[v]);
      g[c[v]].emplace_back(c[u]);
    }
  }
  hld h(g);
  while(k--){
    int u,v; cin>>u>>v,u--,v--;
    if(c[u]!=c[v])h.update(c[u],c[v]);
  }
  cout<<h.get(r)<<endl;
  return 0;
}